# 从 ...extensions 模块导入数据库扩展 db 以及获取北京时间的函数 get_beijing_time
from ...extensions import db, get_beijing_time

# 定义一个模型类 UploadedFile，继承自 db.Model
class UploadedFile(db.Model):
    # 指定数据库中的表名为 'uploaded_files'
    __tablename__ = 'uploaded_files'

    # 定义 id 列为主键，整型，自动递增
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    # 定义 file_name 列为字符串类型，不可为空，最大长度为 200
    file_name = db.Column(db.String(200), nullable=False)

    # 定义 preprocessed_path 列为字符串类型，不可为空，最大长度为 200
    preprocessed_path = db.Column(db.String(200), nullable=False)

    # 定义 created_at 列为日期时间类型，默认值为获取北京时间
    created_at = db.Column(db.DateTime, default=get_beijing_time)

    # 定义 user_id 列为整型，外键，关联 users 表的 id 列，不可为空
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)

    # 定义与 User 模型的关系，反向关系为 uploaded_files
    user = db.relationship('User', back_populates='uploaded_files')

    # 关联预测记录，定义与 Forecast 模型的关系
    # 删除 UploadedFile 实例时，联动删除其相关的 forecasts，反向关系为 uploaded_file
    forecasts = db.relationship('Forecast', back_populates='uploaded_file', cascade="all, delete-orphan")

    # 关联数据可视化记录，定义与 Visualization 模型的关系
    # 删除 UploadedFile 实例时，联动删除其相关的 visualizations，反向关系为 uploaded_file
    visualizations = db.relationship('Visualization', back_populates='uploaded_file', cascade="all, delete-orphan")

    # 关联报告记录，定义与 Report 模型的关系
    # 删除 UploadedFile 实例时，联动删除其相关的 reports，反向关系为 uploaded_file
    reports = db.relationship('Report', back_populates='uploaded_file', cascade="all, delete-orphan")

    # 关联库存管理记录，定义与 InventoryManagement 模型的关系
    # 删除 UploadedFile 实例时，联动删除其相关的 inventory_records，反向关系为 uploaded_file
    # lazy=True 表示延迟加载
    inventory_records = db.relationship('InventoryManagement', back_populates='uploaded_file', cascade="all, delete-orphan", lazy=True)

    # 定义对象的字符串表示方法
    def __repr__(self):
        # 返回文件名称的字符串表示
        return f"<UploadedFile {self.file_name}>"
